import hashlib
import logging
import os
from datetime import datetime
from logging.handlers import RotatingFileHandler

from flask import current_app
from werkzeug.datastructures import FileStorage

from config import config


def setup_log(config_name):
    """配置日志"""

    # 设置日志的记录等级
    logging.basicConfig(level=config[config_name].LOG_LEVEL)  # 调试debug级
    # 创建日志记录器，指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
    file_log_handler = RotatingFileHandler(
        "logs/log.log", maxBytes=1024 * 1024 * 100, backupCount=10
    )
    # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
    formatter = logging.Formatter("%(levelname)s %(filename)s:%(lineno)d %(message)s")
    # 为刚创建的日志记录器设置日志记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象（flask app使用的）添加日志记录器
    logging.getLogger().addHandler(file_log_handler)


def upload_avatar(avatar: FileStorage):
    """
    将图片保存到本地
    """
    path = os.path.dirname(current_app.instance_path)
    avatar_dir = os.path.join(
        path, "static", "avatar", datetime.today().strftime("%Y-%m")
    )
    if not os.path.exists(avatar_dir):
        os.makedirs(avatar_dir)
    # 从 FileStorage 对象里面获取文件名字
    filename = avatar.filename
    # 名字相同,内容不同
    suffix = filename.split(".")[-1]
    # name = uuid.uuid4().hex
    # 内容相同,名字不同 md5 摘要
    content = avatar.stream.read()  # 读取图片之后,就没有内容了
    name = hashlib.md5(content).hexdigest()  # 获取 md5 的值
    # print(name)
    filename = ".".join([name, suffix])

    # 1. 将文件保存
    # avatar.save(dst=os.path.join(avatar_dir, filename))
    open(os.path.join(avatar_dir, filename), mode="wb").write(content)
    # 2. 生成访问地址
    avatar_url = "/".join(
        ["/static", "avatar", datetime.today().strftime("%Y-%m"), filename]
    )
    return avatar_url


def upload_article_img(avatar: FileStorage):
    """
    将图片保存到本地
    """
    path = os.path.dirname(current_app.instance_path)
    avatar_dir = os.path.join(
        path, "static", "article_img", datetime.today().strftime("%Y-%m")
    )
    if not os.path.exists(avatar_dir):
        os.makedirs(avatar_dir)
    # 从 FileStorage 对象里面获取文件名字
    filename = avatar.filename
    # 名字相同,内容不同
    suffix = filename.split(".")[-1]
    # name = uuid.uuid4().hex
    # 内容相同,名字不同 md5 摘要
    content = avatar.stream.read()  # 读取图片之后,就没有内容了
    name = hashlib.md5(content).hexdigest()  # 获取 md5 的值
    # print(name)
    filename = ".".join([name, suffix])

    # 1. 将文件保存
    # avatar.save(dst=os.path.join(avatar_dir, filename))
    open(os.path.join(avatar_dir, filename), mode="wb").write(content)
    # 2. 生成访问地址
    avatar_url = "/".join(
        ["/static", "article_img", datetime.today().strftime("%Y-%m"), filename]
    )
    return avatar_url


def register_api_func(app, view, endpoint, pk):
    """
    app      : 蓝图或者 app 对象
    view     : 视图类对象
    endpoint : 断点 '/user'
    pk       : user_id
    """
    view_func = view.as_view(endpoint)
    app.add_url_rule(
        f"/{endpoint}/", defaults={f"{pk}": None}, view_func=view_func, methods=["GET"]
    )
    app.add_url_rule(f"/{endpoint}/", view_func=view_func, methods=["POST"])
    app.add_url_rule(
        f"/{endpoint}/<int:{pk}>", view_func=view_func, methods=["GET", "PUT", "DELETE"]
    )
